#include "error.h"
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <syslog.h>


static void
_do_error(va_list args, const char *fmt, int errflag) {
	static char buffer[4096] = {0};
    static char errbuf[4096] = {0};
	vsnprintf(buffer, sizeof(buffer), fmt, args);

    int err = errno;
	int len = strlen(buffer);
	if (errflag) {
        strerror_r(err, errbuf, sizeof(errbuf));
		snprintf(buffer+len, sizeof(buffer)-len, "\t[ERROR:%d]:%s\n", errno, errbuf);
    } else {
		snprintf(buffer+len, sizeof(buffer)-len, "\n");
    }

	syslog(LOG_INFO, "%s", buffer);
	fputs(buffer, stdout);
	fflush(stdout);
}

void
error_msg(const char *fmt, ...) {
	va_list args;
	va_start(args, fmt);
	_do_error(args, fmt, 0);
	va_end(args);
}

void
error_quit(const char *fmt, ...) {
	va_list args;
	va_start(args, fmt);
	_do_error(args, fmt, 0);
	va_end(args);
	exit(EXIT_FAILURE);
}

void
error_dump(const char *fmt, ...) {
	va_list args;
	va_start(args, fmt);
	_do_error(args, fmt, 1);
	va_end(args);
	abort();
}
